// 2-3 动态内存-对象的动态内存分配

/**
 * 了解动态内存在 C++ 中是如何工作的是成为一名合格的 C++ 程序员必不可少的。C++ 程序中的内存分为两个部分：

    栈：在函数内部声明的所有变量都将占用栈内存。
    堆：这是程序中未使用的内存，在程序运行时可用于动态分配内存。

 * 很多时候，您无法提前预知需要多少内存来存储某个定义变量中的特定信息，所需内存的大小需要在运行时才能确定。

 * 在 C++ 中，您可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存，这会返回所分配的空间地址。这种运算符即 new 运算符。

 * 如果您不再需要动态分配的内存空间，可以使用 delete 运算符，删除之前由 new 运算符分配的内存。
 *
 * 
 * 对象的动态内存分配
 * 对象与简单的数据类型没有什么不同。例如，请看下面的代码，我们将使用一个对象数组来理清这一概念：（实例一）
 * 
 * 如果要为一个包含四个 Box 对象的数组分配内存，构造函数将被调用 4 次，同样地，当删除这些对象时，析构函数也将被调用相同的次数（4次）。

 * 当上面的代码被编译和执行时，它会产生下列结果：
        
        调用构造函数
        调用构造函数
        调用构造函数
        调用构造函数
        -----------delete---------
        调用析构函数
        调用析构函数
        调用析构函数
        调用析构函数
*/

#include <iostream>
#include <ctime>
#define __mark 1

/**
 * #1 对象的动态内存分配
*/
#if __mark == 1
class Box
{
private:
  /* data */
public:
  Box(/* args */);
  ~Box();
};

Box::Box(/* args */)
{
  std::cout << "调用构造函数" << std::endl;
}

Box::~Box()
{
  std::cout << "调用析构函数" << std::endl;
}

int main(void)
{
  // Box *b = new Box;
  // std::cout << "-----------delete---------" << std::endl;
  // delete b;


  const int x = 4;
  Box *arr = new Box[x];

  // 释放
  std::cout << "-----------delete---------" << std::endl;
  // delete arr; // 这个就调用了一次析构函数
  delete[] arr;
  printf("-----------------end--------------\n");
  return 0;
}

/**
 * #2
*/
#elif __mark == 2

int main(void)
{
  printf("-----------------end--------------\n");
  return 0;
}
#endif